import time
import requests
import logging

class ProxyManager:
    def __init__(self,ntype):
        current_time = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
        # 初始化日志系统
        self.logger = logging.getLogger(f'ProxyManagerLogger_{current_time}')
        self.logger.setLevel(logging.DEBUG)  # 设置logger级别为DEBUG

        # 创建handler，用于写入日志文件
        fh = logging.FileHandler(f'log/ProxyManagerLogger_{current_time}_{ntype}')
        fh.setLevel(logging.DEBUG)  # 设置handler级别为DEBUG

        # 定义handler的输出格式
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        fh.setFormatter(formatter)

        # 给logger添加handler
        self.logger.addHandler(fh)

        self.IP_POOL = dict()
        self.IP_POOL_TURNS = {}
        self.last_usage_times = {}

    def get_proxy_ip(self, current_time):
        """
        获取代理IP
        """
        self.IP_POOL.clear()
        ## 一条一条IP的查询
        ip_list = requests.get(
            "https://dps.kdlapi.com/api/getdps/?secret_id=oogsvr21bo1beim4ljd9&signature=wcfzsihmegxanhk2dhwjhj3oouchtgl8&num=1&pt=1&format=json&sep=1&dedup=1").json()[
            'data']['proxy_list']
        # ip_list = ["218.95.37.11:25152", "219.150.218.21:25089", "218.95.37.161:25015" ]
        for new_ip in ip_list:
            ip_parts = new_ip.split(':')
            ip_address = ip_parts[0]
            port = ip_parts[1]
            self.IP_POOL[ip_address] = port
            if current_time == '':
                current_time = time.time()
            self.IP_POOL_TURNS[current_time] = self.IP_POOL.copy()

    def use_ip_pool(self, timestamp):
        self.logger.info("使用IP_POOL，当前last_usage_times状态：%s", str(self.last_usage_times))
        """
        标记一个IP_POOL为已使用，并更新其最后使用时间。
        """
        timestamp_now = time.time()
        self.last_usage_times[timestamp] = timestamp_now

    def get_usable_ip_pools(self):
        """
        返回所有自上次使用时间已经超过1分钟的IP_POOL，优先返回未使用过的IP_POOL，
        如果所有IP_POOL都被使用过，则返回上次使用时间最久远且满足current_time - last_usage > 70的IP_POOL。
        如果没有满足条件的IP_POOL，则重新获取新的代理IP。
        """
        current_time = time.time()
        usable_pools = {}
        never_used_pools = []
        used_pools = []

        self.logger.info("开始查找可用IP_POOL...")

        # 分类IP_POOL：从未使用过的和使用过的
        for timestamp, ip_pool in self.IP_POOL_TURNS.items():
            last_usage = self.last_usage_times.get(timestamp)
            if last_usage is None:  # 从未使用过
                never_used_pools.append((timestamp, ip_pool))
            elif current_time - last_usage > 65:  # 已使用过且满足时间条件
                used_pools.append((timestamp, ip_pool, last_usage))

        # 如果有从未使用过的IP_POOL，直接返回
        if never_used_pools:
            never_used_pools.sort()
            usable_pools[never_used_pools[0][0]] = never_used_pools[0][1]

        # 如果没有从未使用过的IP_POOL，查找上次使用时间最久远的IP_POOL
        elif used_pools:
            used_pools.sort(key=lambda x: x[2])  # 按上次使用时间排序
            usable_pools[used_pools[0][0]] = used_pools[0][1]

        # 如果没有满足条件的IP_POOL，则重新获取新的代理IP
        else:
            self.get_proxy_ip(current_time)
            usable_pools[current_time] = self.IP_POOL_TURNS[current_time]

        self.logger.info("查找结果，usable_pools状态：%s", str(usable_pools))
        self.logger.info("查找结果，IP_POOL_TURNS状态：%s", str(self.IP_POOL_TURNS))
        return usable_pools

    def remove_key_from_dict(self, interval):
        """
        移除IP_POOL_TURNS中最后一次更新时间超过interval秒的条目，
        同时从last_usage_times中删除对应的键值对。
        """
        remove_list = []
        self.logger.info("开始移除过期的IP_POOL条目...")
        current_time = time.time()
        keys_to_remove = []

        # 遍历字典，找到所有需要移除的键和对应的ip_pool标识符
        for key in list(self.IP_POOL_TURNS.keys()):
            if current_time - key > interval:
                keys_to_remove.append(key)

        # 移除IP_POOL_TURNS中的键
        for key in keys_to_remove:
            ip_dict = self.IP_POOL_TURNS[key]
            for ip in ip_dict:
                remove_list.append(ip + ':' + ip_dict[ip])
            del self.IP_POOL_TURNS[key]
            del self.last_usage_times[key]
        self.logger.info("移除操作完成，当前IP_POOL_TURNS状态：%s", str(self.IP_POOL_TURNS))
        self.logger.info("当前last_usage_times状态：%s", str(self.last_usage_times))
        return remove_list

